var arr = [1, 2, 3, '1', '1', ['a', 'b']]

// 遍历
arr.forEach(function(item, index, self){
    console.log(item + ' |' + index + ' |' + self)
})

// 增加，添加到数组最后，改变原数组，返回新增后的数组
arr.push('add')
console.log(arr)

// 删除，删除数组最后值，改变原数组，返回删除后的数组
arr.pop()
console.log(arr)

// 增加.增加到数组第一个值，改变原数组，返回增加后的数组长度
var firstnarr = arr.unshift('first')
console.log(firstnarr)

// 删除.删除数组第一个值，改变原数组，返回删除的值
var returnarr = arr.shift()
console.log(returnarr)
console.log(arr)

// 查找索引.返回索引值.没有返回-1,有则返回找到的第一个值所在索引
var index = arr.indexOf('1')
console.log(index)

// 根据索引删除地址指定个元素。单一参数则从0开始到该索引值删除
var splicearr = arr.splice(3, 1)
console.log(arr)
console.log(splicearr)

// 复制数组
var clonearr = arr.slice()
console.log(clonearr)
console.log(arr)
clonearr.push('引用')
console.log(clonearr)
console.log(arr)

// 倒序
var reversearr = arr.reverse()
console.log(reversearr)

// 排序
var sortarr = arr.sort()
console.log(sortarr)
// 使用sort倒序
var sortarr2 = arr.sort(compareFunction)
console.log(sortarr2)
function compareFunction(){
    return false
}

// 连接，连接2个数组，原数组不变，返回新数组
var arrother = [8, 9, 10]
var concatarr = arrother.concat(arr)
console.log(concatarr)

// 连接，连接数组每一个元素，返回连接后的字符串
var newsplit = arr.join('|')
console.log(newsplit)

// 提取，改变原数组，提取数组中一部分元素，返回提取后的数组
var newsplice = arr.splice(1, 3)
console.log(newsplice)
console.log(arr)

// 遍历，不改变原数组，返回每一个元素执行回调后的返回值组成的数组
var maparr = newsplice.map(function(item, index, self){
    return !isNaN(item)?item*2:item
})
console.log(maparr)


// 累加器,数组从第一个元素开始，每次将2个元素传入回调函数并执行回调，并将当次会调值与下一个元素作为参数再次传入回调。如果参数数量少于2则停止调用。返回值为回调方法执行后的值
var reducearr = newsplice.reduce(function (cur, pre, currentIndex, source) {
    console.log(cur, pre, currentIndex, source)
    return cur + pre
})
console.log(reducearr)

// 累加器,数组从最后一个元素开始，每次将2个元素传入回调函数并执行回调，并将当次会调值与下一个元素作为参数再次传入回调。如果参数数量少于2则停止调用。返回值为回调方法执行后的值
var reduceRightarr = newsplice.reduceRight(function (cur, pre, currentIndex, source) {
    console.log(cur, pre, currentIndex, source)
    return cur + pre
})
console.log(reduceRightarr)
